package user

import (
	"admin/src/global"
	"admin/src/log"
	"admin/src/models"
	"admin/src/res"
	"admin/src/response"
	"admin/src/utils"
	"errors"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

type UserController struct{}

// Login 登录接口
// @Summary 登录接口
// @Description 用户登录接口
// @Tags 用户模块
// @Accept application/json
// @Produce application/json
// @Param object body models.UserModel true "参数"
// @Security ApiKeyAuth
// @Router /api/user/login [post]
func (u *UserController) Login(c *gin.Context) {
	var req models.UserModel
	if err := c.ShouldBind(&req); err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("登录失败", zap.Error(err))
		return
	}

	//读取私钥
	privateKey, err := utils.LoadPrivateKey("key/private.pem")
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("读取私钥失败", zap.Error(err))
		return
	}

	//解密
	_, err = utils.DecryptWithPrivateKey(privateKey, []byte(req.Password))
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("密码错误", zap.Error(err))
		return
	}

	result := global.DB.Where("account = ? AND password = ? AND status = ?", req.Account, req.Password, 1).First(&req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("", zap.Error(result.Error))
		return
	}
	token, err := utils.CreateJWT(int(req.ID), req.Account)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("", zap.Error(err))
		return
	}
	res.Ok(c, response.Login{
		UserModel: req,
		Token:     token,
	})
}

// Register 注册接口
// @Summary 注册接口
// @Description 用户注册接口
// @Tags 用户模块
// @Accept application/json
// @Produce application/json
// @Param object body models.UserModel true "参数"
// @Security ApiKeyAuth
// @Router /api/user/register [post]
func (u *UserController) Register(c *gin.Context) {
	var req models.UserModel
	if err := c.ShouldBind(&req); err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("", zap.Error(err))
		return
	}

	result := global.DB.Where("account = ?", req.Account).Take(&req)
	if errors.Is(result.Error, gorm.ErrRecordNotFound) {
		result = global.DB.Create(&req)
		if result.Error != nil {
			res.ErrorMsg(c, result.Error.Error())
			log.Logger.Error("注册失败", zap.Error(result.Error))
			return
		}
		res.Ok(c, "注册成功")
	} else if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("", zap.Error(result.Error))
		return
	} else if result.RowsAffected > 0 {
		res.ErrorMsg(c, "账号已存在")
		return
	}
}

// GetUserInfo 获取用户信息
// @Summary	获取用户信息
// @Description 获取用户信息
// @Tags 用户模块
// @Accept application/json
// @Produce application/json
// @Param object body models.UserModel true "参数"
// @Security ApiKeyAuth
// @Router /api/user/info [post]
func (*UserController) GetUserInfo(c *gin.Context) {
	userId := c.GetInt("user_id")
	var user models.UserModel
	result := global.DB.Preload("Menus").Where("id = ?", userId).First(&user)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("", zap.Error(result.Error))
		return
	}
	res.Ok(c, user)
}

// UpdateUser 修改用户信息
// @Summary 修改用户信息
// @Description 修改用户信息
// @Tags 用户模块
// @Accept application/json
// @Produce application/json
// @Param object body models.UserModel true "参数"
// @Security ApiKeyAuth
// @Router /api/user/update [put]
func (*UserController) UpdateUser(c *gin.Context) {
	var req models.UserModel
	err := c.ShouldBind(&req)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("", zap.Error(err))
		return
	}
	result := global.DB.Model(&models.UserModel{}).Where("id = ?", req.ID).Updates(req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("更新失败", zap.Error(result.Error))
		return
	}
	res.Ok[models.UserModel](c, req)
}

// DeleteUser 删除用户信息
// @Summary 删除用户信息
// @Description 删除用户信息
// @Tags 用户模块
// @Accept application/json
// @Produce application/json
// @Param   ids   query    []int  true  "ID列表"  collectionFormat(csv)
// @Security ApiKeyAuth
// @Router /api/user/delete [delete]
func (*UserController) DeleteUser(c *gin.Context) {
	var ids []int
	err := c.ShouldBind(&ids)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("", zap.Error(err))
		return
	}
	result := global.DB.Where("id in ?", ids).Delete(&models.UserModel{})
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("删除失败", zap.Error(result.Error))
		return
	}
	res.Ok(c, "删除成功")
}
